#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <cctype>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <set> 
#include <algorithm> 
#include <map>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef long long unsigned ull;
typedef unsigned uint;

template <class T> inline T sqr(T x) { return x * x; }
template <class T> inline void updMin(T& a, const T& b) { if (b < a) a = b; }
template <class T> inline void updMax(T& a, const T& b) { if (b > a) a = b; }

const int maxn = 2000 + 100;
const int maxm = 200000 + 100;

vector<int> boys[maxn]; 
vector<int> girls[maxn]; 


int boyStart[maxn];
int girlStart[maxn];
int boyNext[maxm];
int girlNext[maxm];

int boyTo[maxm];
int girlTo[maxm];

int eSize = 0;

int frG[maxn];
int frB[maxn];

int ITER;

bool d[maxn][maxn];
int vis[maxn];
bool can[maxn][maxn];
int q[maxn]; 
int glId;

int head = 0, tail = 0; 

inline void bfs(int girlId) {
	head = tail = 0; 
	q[head++] = girlId; 

	while (head > tail) {
		int x = q[tail++]; 
		vis[x] = ITER;
		can[glId][x] = true;
		x = frG[x];
		for (int i = 0; i < boys[x].size(); i++) {
			int gt = boys[x][i];
			if (gt == girlId) { // matching edge
				continue;
			} else {    
				if (vis[gt] != ITER) {     
					q[head++] = gt; 
					vis[gt] = ITER; 
				}
			}
		}
	}
}

inline void dfs1(int girlId)
{
	vis[girlId] = ITER;
	can[glId][girlId] = true;
	int boyId = frG[girlId];
	for (int j = 0; j < boys[boyId].size(); j++) {
		int gt = boys[boyId][j];
		if (gt == girlId) { // matching edge
			continue;
		} else {
			if (vis[gt] != ITER) {
				dfs1(gt);
			}
		}
	}
}

int main()
{
	//freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
	//freopen("input2.txt", "r", stdin); freopen("output.txt", "w", stdout);

	int n;
	scanf("%d", &n);
	//n = 2000; 
	
	memset(boyStart, -1, sizeof(boyStart));
	memset(girlStart, -1, sizeof(girlStart));

	for (int i = 0; i < n; ++i)
	{
		int k;
		scanf("%d", &k);
		for (int j = 0; j < k; ++j)
		{
			int to;
			scanf("%d", &to);
			--to;

			boys[i].push_back(to); 
			girls[to].push_back(i); /*

			boyNext[eSize] = boyStart[i];
			boyStart[i] = eSize;
			boyTo[eSize] = to;

			girlNext[eSize] = girlStart[to];
			girlStart[to] = eSize;
			girlTo[eSize] = i;

			++eSize;*/
		}
	}

	
	for (int i = 0; i < n; ++i)
	{
		int girl;
		scanf("%d", &girl);
		--girl;
		frB[i] = girl; 
		frG[girl] = i;
	}

	for (int i = 0; i < n; ++i) { // calc can from girl i
		++ITER;
		glId = i;
		//dfs1(i);
		bfs(i); 
	}

	for (int i = 0; i < n; ++i) { // get answer for boy i
		int finish = frB[i];
		int l = 0;
		for (int j = 0; j < boys[i].size(); j++) {
			int gId = boys[i][j];
			l += can[gId][finish];
		}
		printf("%d ", l);
		for (int j = 0; j < boys[i].size(); j++) {
			int girl = boys[i][j];

			if (can[girl][finish])
				printf("%d ", girl + 1);
		}
		puts("");
	}

	/*for (int i = 0; i < n; ++i)
	{
		int l = 0;
		for (int j = 0; j < n; ++j)
			l += int(d[i][j]);
		printf("%d ", l);
		for (int j = boyStart[i]; j != -1; j = boyNext[j])
		{
			int girl = boyTo[j];
			if (d[i][girl])
				printf("%d ", girl + 1);
		}
		puts("");
	}*/

	//cerr << fixed << setprecision(2) << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
	return 0;
}